package br.com.rotary.servico;

import br.com.rotary.generico.ServicoGenerico;
import br.com.rotary.modelo.Clube;
import br.com.rotary.modelo.FichaInscricao;
import java.beans.Transient;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class ClubeServico extends ServicoGenerico<Clube> {

    private Long quantidadeRegistrosResults;

    public ClubeServico() {
        super(Clube.class);
    }

    public List<Clube> autocomplete(String query) {
        String sql = "select c from " + Clube.class.getSimpleName() + " c "
                + "where lower(c.nome) like :nome";

        Query results = getEntityManager().createQuery(sql);

        results.setParameter("nome", "%" + query.toLowerCase().trim() + "%");

        return results.getResultList();
    }

    @Override
    public void remover(Clube entity) {
        entity.setAtivo(false);
        atualizar(entity);
    }

    /**
     * Pesquisar Clube
     *
     * @param pesquisarClube
     * @return
     */
    @Override
    public List<Clube> pesquisar(Clube entidade, Integer first, Integer pageSize) {

        String select = "select c ";
        String orderBy = "order by c.id asc";

        String sql = "from " + Clube.class.getSimpleName() + " c ";

        sql += "WHERE ";

        if (entidade.getNome() != null && !entidade.getNome().isEmpty()) {
            sql += "lower(c.nome) like lower(:nome) AND ";
        }

        if (entidade.getCodigo() != null) {
            sql += "c.codigo = :codigo AND ";
        }

        sql += " c.ativo = true ";

        Query query = getEntityManager().createQuery(select.concat(sql).concat(orderBy));

        setQuantidadeRegistros(sql, query, entidade);

        setParameters(entidade, query);

        if (first != null && pageSize != null) {
            query.setFirstResult(first).setMaxResults(pageSize);
        }

        return query.getResultList();
    }

    @Transient
    private void setParameters(Clube entidade, Query query) {

        if (entidade.getNome() != null && !entidade.getNome().isEmpty()) {
            query.setParameter("nome", "%" + entidade.getNome() + "%");
        }
        if (entidade.getCodigo() != null) {
            query.setParameter("codigo", entidade.getCodigo());
        }
    }

    private void setQuantidadeRegistros(String sql, Query query, Clube entidade) {

        String select = "SELECT count(c) ";

        query = getEntityManager().createQuery(select + sql);

        setParameters(entidade, query);

        quantidadeRegistrosResults = (Long) query.getSingleResult();
    }

    @Override
    public Long quantidadeRegistros() {
        return quantidadeRegistrosResults;
    }

    public List<Clube> clubesInscritos() {

        String sql = "select distinct c from " + FichaInscricao.class.getSimpleName() + " f JOIN f.clube c where f.ativo = true order by c.nome";

        Query query = getEntityManager().createQuery(sql);

        return query.getResultList();
    }
}
